package com.soft.javase.ch10.lambda;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * @author wangzhisen
 * @Desc TODO
 * @date 2025/5/6
 *
 * Lambda 表达式
 * 1.场景：简化匿名内部类的写法
 * 前提：调用方法传参时，需要传入的是new 接口（符合函数式接口规范 @FunctionalInterface）
 * 1.1 JButton添加事件    ActionListener
 * 1.2 TreeSet比较性      Comparator
 * 1.3 集合forEach()      Consumer消费型
 * 1.4 Thread线程         Runnable
 *
 * 2.简化
 * 关于参数列表
 * 2.1 简化的接口中的抽象方法，没有形参
 *      1）、方法名省略  2）、无参的情况下，小括号必须保留，加上->箭头指向方法体
 * 2.2 简化的接口中的抽象方法，有一个形参
 *      1）、方法名省略  2）、参数类型省略，小括号可以省略，加上->箭头指向方法体
 * 2.3 简化的接口中的抽象方法，有多个形参
 *      1）、方法名省略  2)、形参类型一致的省略数据类型，但是小括号不可以丢，加上->箭头指向方法体
 *
 * 关于方法体及返回值
 *      1）、方法体中只有一行代码时，且没有返回值，可以省略大括号（分号;必省略）
 *      2）、方法体中只有一行代码时，且有返回值，可以省略大括号（分号必省略，return必省略）
 *      3）、当方法体中多行代码的情况下，原来咋写你就咋写
 */
public class LambdaDemo1 extends JFrame {

    public LambdaDemo1() {
        this.setTitle("案例");
        this.setSize(300, 400);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setLocationRelativeTo(getOwner());

        Container container = this.getContentPane();
        JButton btn = new JButton("点击我！");
        container.add(btn);

        //需求：点击按钮，弹出对话框，对话框中显示的是按钮的文本
        //1.事件源：按钮btn 2.事件类型：ActionListener + ActionEvent 3.触发事件后，做啥：弹出对话框，对话框中显示的是按钮的文本
        btn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(LambdaDemo1.this, btn.getText());
            }
        });

        System.out.println("-------------Lambda简化1-------------");
        btn.addActionListener((ActionEvent e)-> {
            JOptionPane.showMessageDialog(LambdaDemo1.this, btn.getText());
        });
        System.out.println("-------------Lambda简化2-------------");
        btn.addActionListener(e -> JOptionPane.showMessageDialog(LambdaDemo1.this, btn.getText())
        );
    }

    public static void main(String[] args) {
        new LambdaDemo1().setVisible(true);
    }
}
